package utils

import (
	"errors"
	"multi-cloud-manage/internal/model"
	"time"

	"github.com/golang-jwt/jwt/v5"
)

// 定义token声明的结构体
type Claims struct {
	UserID   int
	Username string
	jwt.RegisteredClaims
}

// 生成token（需要传递用户的ID，用户名）
func GenerateJWT(user *model.User, jwt_secret string) (string, error) {
	// 创建结构体变量，提供所需的各个字段
	cliams := Claims{
		UserID:   user.Id,
		Username: user.Username,
		RegisteredClaims: jwt.RegisteredClaims{
			ExpiresAt: jwt.NewNumericDate(time.Now().Add(time.Hour)), // 过期时间为1小时
			IssuedAt:  jwt.NewNumericDate(time.Now()),                // 签发时间
			Issuer:    "www.tmooc.cn",                                // 签发者，通常使用域名
		},
	}
	// 创建JWT对象(提供算法)
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, cliams)
	// 结合秘钥，声明token
	return token.SignedString([]byte(jwt_secret))
}

// 解析验证token(传递生成的token)
func ParseToken(tokenString string, jwtSecret string) (*Claims, error) {
	// 创建一个Claims变量用于存储解析后的声明
	claims := &Claims{}
	// 创建一个JWT解析器
	token, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) {
		// 返回签名密钥
		return []byte(jwtSecret), nil
	})
	if err != nil {
		// 如果解析失败，返回错误
		return nil, err
	}
	if !token.Valid {
		// 如果Token无效，返回错误
		return nil, errors.New("invalid token")
	}
	// 如果解析成功，返回Claims
	return claims, nil
}
